package cn.tedu.design;
/*本类用于实现单例设计模式方案2:懒汉式
* 关于单例设计模式的两种方式:
* 1,饿汉式:不管你用不用这个类的对象,都会直接先创建一个
* 2,懒汉式::先不给你创建这个类的对象,等你需要的时候再创建--延迟加载的思想
* 延迟加载的思想:是指不会在第一时间就把对象创建好占用内存
*              而是什么时候用到,什么时候再取创建对象
* 3,线程安全问题:由于我们存在唯一的对象single2,并且多条语句都操作了这个变量
* 所以,如果将程序放在多线程的环境下,就容易出现数据安全的问题,解决方案:
* 1)将3条语句都使用同步代码块包裹,保证同步排队的效果
* 2)由于getSingle()方法里也只有这3条语句,所以也可以将本方法修饰为同步方法
* 注意:被 synchronized 修饰的方法称作同步方法,但是不推荐使用*/
public class Singleton2 {
    public static void main(String[] args) {
        Mysingle2 s1 = Mysingle2.getsingle();
        Mysingle2 s2 = Mysingle2.getsingle();
        System.out.println(s1);
        System.out.println(s2);
    }
}
//1,创建自己的单例程序Mysingle2
class Mysingle2{
    static Object o=new Object();

    //2,私有化本类的方法
    private  Mysingle2(){}
    //3,创建的是本类对象对应类型的引用类型变量,用来保存对象的地址值
    static  Mysingle2 single2;//引用类型的成员变量,默认值为null
    //4,提供公共的静态资方法将创建好的对象返回
    public static Mysingle2 getsingle(){
        synchronized (o){
            if (single2==null){
                single2=new Mysingle2();
            }

            return single2;
        }

    }

}